package com.jd.oneday.month3;


import java.util.LinkedList;

/**
 * 1.链表的创建
 * 2.按照ID顺序插入链表
 * 3.修改链表节点信息   根据id修改   所以id编号不能改
 */
public class Day05 {
    public static void main(String[] args) {

        //创建节点
        LinkedListNode listNode1 = new LinkedListNode(3, "刘龙辉", 88);
        LinkedListNode listNode2 = new LinkedListNode(1, "刘宇鹏", 28);
        LinkedListNode listNode3 = new LinkedListNode(32, "刘伟超", 38);
        LinkedListNode listNode4 = new LinkedListNode(13, "刘文星", 48);

        //创建一个链表
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.add(listNode1);
        singleLinkedList.add(listNode2);
        singleLinkedList.add(listNode3);
        singleLinkedList.add(listNode4);

        //创建一个链表  按照ID顺序插入
//        SingleLinkedList singleLinkedList = new SingleLinkedList();
//        singleLinkedList.ByIDAdd(listNode1);
//        singleLinkedList.ByIDAdd(listNode2);
//        singleLinkedList.ByIDAdd(listNode3);
//        singleLinkedList.ByIDAdd(listNode4);


        //通过链表节点id来修改
        LinkedListNode listNode5 = new LinkedListNode(32, "刘满超", 58);
        singleLinkedList.update(listNode5);


        //遍历
        singleLinkedList.list();
    }
}


// 定义一个管理链表的类
class SingleLinkedList {
    //先初始化一个头节点，头节点不能动，不存放具体数据
    private LinkedListNode head = new LinkedListNode(0, "", 0);


    //添加节点到单向链表
    public void add(LinkedListNode h) {

        //因为头部节点不能动，所以需要一个辅助指针
        LinkedListNode temp = head;

        while (true) {
            if (temp.next == null) {    //找到链表的最后一个节点
                break;
            }
            temp = temp.next;  //如果没有找到最后一个节点   temp后移
        }
        temp.next = h;  // 将最后这个节点指向新节点
    }


    //按id插入链表
    public void ByIDAdd(LinkedListNode h) {
        //因为头部节点不能动，所以需要一个辅助指针
        LinkedListNode temp = head;
        boolean flag = false;  //判断ID编号是否存在，默认为flase
        while (true) {
            if (temp.next == null) {   //以到链表最后一个节点
                break;
            }
            if (temp.next.id > h.id) {  //找到插入位置
                break;
            } else if (temp.next.id == h.id) {  //想要插入的ID存在
                flag = true;
                break;
            }
            temp = temp.next;  // 后移  链表遍历
        }
        if (flag) {  //不能添加，ID已存在
            System.out.println("想要插入的ID" + h.id + "已存在");
        } else {
            //插入到链表中 temp的后边
            h.next = temp.next;   //先将前面节点的next给新插入节点的next
            temp.next = h;   //后将前面节点的next指向新的节点
        }
    }


    /**
     * @param h 字节的
     *          <p>
     *          1. sss
     *          2. ss
     */
    public void update(LinkedListNode h) {

        //因为头部节点不能动，所以需要一个辅助指针
        LinkedListNode temp = head.next;
        //判断节点是否为空
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        //找到需要修改的节点，根据id寻找
        boolean flay = false; //判断ID编号是否存在，默认为flase
        while (true) {
            if (temp.next == null) {
                break;   //链表遍历完毕
            }
            if (temp.id == h.id) {  //找到了需要修改节点的id
                flay = true;
                break;
            }
            temp = temp.next;  //后移   遍历
        }
        //根据flay判断是否找到要修改的节点
        if (flay) {
            temp.name = h.name;
            temp.age = h.age;
        } else {
            System.out.println("没有找到ID为" + h.id + "的节点，不能修改");
        }
    }


    //显示  遍历链表
    public void list() {
        if (head.next == null) {
            System.out.println("这是个空链表");
            return;
        }
        //因为链表头节点不能动，所以需要一个辅助指针
        LinkedListNode temp = head.next;
        while (true) {
            if (temp == null) {  //判断是否到链表最后一个节点
                break;
            }
            //输出节点信息
            System.out.println(temp);
            temp = temp.next; // 将temp后移
        }
    }
}

// 定义一个链表节点对象
class LinkedListNode {

    public int id;
    public String name;
    public int age;
    public LinkedListNode next;

    //构造器
    public LinkedListNode(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "LinkedListNode{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
